import java.nio.charset.Charset;
import java.sql.SQLOutput;

public class CharsetUtils {

    public static void main(String[] args) {
        System.out.println("赊购采购");
        String original = "赊购采购";
        String gbk = new String(original.getBytes(), Charset.forName("GBK"));

        String gbk2gb18030 = new String(gbk.getBytes(Charset.forName("GBK")), Charset.forName("GB18030"));
        System.out.println("gbk2gb18030:" + gbk2gb18030);

        String gbk2utf8 = new String(gbk.getBytes(Charset.forName("GBK")), Charset.forName("UTF8"));
        System.out.println("gbk2utf8:" + gbk2utf8);

//
//        String original = "赊购采购";
//
//        // 将字符串转换为GBK编码的字节数组
//        byte[] gbkBytes = original.getBytes(Charset.forName("GBK"));
//
//        // 将GBK字节数组转换回字符串（为了演示，实际应用中这一步可以省略）
//        String gbkString = new String(gbkBytes, Charset.forName("GBK"));
//
//        // 将字符串转换为GB18030编码的字节数组
//        byte[] gb18030Bytes = gbkString.getBytes(Charset.forName("GB18030"));
//
//        // 将GB18030字节数组转换回字符串并输出
//        String gb18030String = new String(gb18030Bytes, Charset.forName("GB18030"));
//        System.out.println("gbk2gb18030: " + gb18030String);
//
//        // 转换为UTF-8编码并输出
//        String utf8String = new String(gbkBytes, Charset.forName("UTF-8"));
//        System.out.println("gbk2utf8: " + utf8String);

    }


//    /**
//     * 字符集转换测试
//     */
//    @Test
//    public void charsetConvert() {
////        byte[] gbkBytes = {(byte) 0xA9, (byte) 0x96};
//
//        byte[] gbkBytes = {(byte) 0x97, (byte) 0x20};
//
//        System.out.print("容错模式，GBK -> ISO-8859-1：");
//        System.out.println(new String(lerantConvert(gbkBytes, "UTF-8", "UTF-8")));
//        System.out.print("容错模式，GBK -> UTF-8：");
//        System.out.println(new String(lerantConvert(gbkBytes, "GBK", "UTF-8")));
//
//        System.out.print("严格模式，GBK -> ISO-8859-1：");
//        try {
//            System.out.println(new String(strictConvert(gbkBytes, "GBK", "ISO-8859-1")));
//        } catch (CharacterCodingException e) {
//            System.out.println("Error：" + e.getMessage());
//        }
//
//        System.out.print("严格模式，GBK -> ISO-8859-1：");
//        try {
//            System.out.println(new String(strictConvert(gbkBytes, "GBK", "UTF-8")));
//        } catch (CharacterCodingException e) {
//            System.out.println("Error：" + e.getMessage());
//        }
//    }
//
//
//    /**
//     * 十六进制字符串还原测试。例如blob字段存储的是二进制，vsql直接查询出来就是16进制字符串，这里使用java还原，目的是了解其原理。
//     */
//    @Test
//    public void rawHexStrRestore() throws UnsupportedEncodingException {
//        // 该字符串时byte数组的16进制表示，2个字符组成一个字节，例如3C=\0x3C=60, 3F=\0x3F=63
//        String str = "3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0A3C6C6962726172793E0A202020203C626F6F6B2069643D22626B313031223E0A20202020202020203C617574686F7" +
//                "23E47616D62617264656C6C612C204D6174746865773C2F617574686F723E0A20202020202020203C7469746C653E584D4C20446576656C6F70657227732047756964653C2F7469746C653E0A20202020202020203C6" +
//                "7656E72653E436F6D70757465723C2F67656E72653E0A20202020202020203C70726963653E34342E39353C2F70726963653E0A20202020202020203C7075626C6973685F646174653E323030302D31302D30313C2F7" +
//                "075626C6973685F646174653E0A20202020202020203C6465736372697074696F6E3E416E20696E2D6465707468206C6F6F6B206174206372656174696E67206170706C69636174696F6E73207769746820584D4C2E3" +
//                "C2F6465736372697074696F6E3E0A202020203C2F626F6F6B3E0A202020203C212D2D20E585B6E4BB96E4B9A6E7B18DE4BFA1E681AF202D2D3E0A3C2F6C6962726172793E";
//
//        // 原理就是每两个16进制字符还原成一个字节，然后再将字节数组转换成字符串
//       // String s = new String(DatatypeConverter.parseHexBinary(str), "UTF-8");
//       // System.out.println(s);
//    }
//
//
//    /**
//     * 严格模式字符集转换（报错）
//     */
//    public static byte[] strictConvert(byte[] originBytes, String originCharset, String targetCharset) throws CharacterCodingException {
//        CharsetDecoder decoder = Charset.forName(originCharset).newDecoder()
//                .onMalformedInput(CodingErrorAction.REPORT)
//                .onUnmappableCharacter(CodingErrorAction.REPORT);
//
//        CharsetEncoder encoder = Charset.forName(targetCharset).newEncoder()
//                .onUnmappableCharacter(CodingErrorAction.REPORT);
//
//        ByteBuffer inputBuffer = ByteBuffer.wrap(originBytes);
//        CharBuffer charBuffer = decoder.decode(inputBuffer);
//        return encoder.encode(charBuffer).array();
//    }
//
//
//    /**
//     * 容错模式字符集转换（替换为问号）
//     */
//    public static byte[] lerantConvert(byte[] originBytes, String originCharset, String targetCharset) {
//        CharsetDecoder decoder = Charset.forName(originCharset).newDecoder()
//                .onMalformedInput(CodingErrorAction.REPLACE) // 用U+FFFD替换错误字节
//                .onUnmappableCharacter(CodingErrorAction.REPLACE);
//
//        CharsetEncoder encoder = Charset.forName(targetCharset).newEncoder()
//                .onUnmappableCharacter(CodingErrorAction.REPLACE);
//
//        ByteBuffer inputBuffer = ByteBuffer.wrap(originBytes);
//        try {
//            CharBuffer charBuffer = decoder.decode(inputBuffer);
//            ByteBuffer outputBuffer = encoder.encode(charBuffer);
//            return outputBuffer.array();
//        } catch (CharacterCodingException e) {
//            return new byte[0]; // 实际应处理异常
//        }
//    }
//

}
